package edu.intec.matsab.form;

import edu.intec.matsab.dao.CarreraDAO;
import edu.intec.matsab.dao.EstudianteDAO;
import edu.intec.matsab.persistence.Carrera;
import edu.intec.matsab.persistence.Estado;
import edu.intec.matsab.persistence.Estudiante;
import edu.intec.matsab.persistence.Pensum;
import edu.intec.matsab.persistence.PensumPK;
import edu.intec.matsab.persistence.Usuario;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.Pattern;

/**
 *
 * @author matilde
 */
public class ManageStudentBean {

    private String tipoBusqueda;
    private String idCarrera;
    private String matricula;
    private Estudiante estudiante;
    private Pensum pensum;
    private List<SelectItem> carrerasItems;
    private List<Estudiante> listEstudiante;
    
    @NotEmpty( message="Este campo es requerido")
    @Pattern(regex = "\\d+", message = "Este campo solo debe contener numeros 0-9")
    @Length(min = 6, max = 6, message="Este campo tiene un maximo de 6 numeros")
    private Carrera carrera;
    
    private boolean success;
    public boolean accion = true;

    public ManageStudentBean() {
        carrera = new Carrera();
        carrerasItems = new ArrayList<SelectItem>();
        listEstudiante = new ArrayList<Estudiante>();
        estudiante = new Estudiante();
        estudiante.setSexo('M');
        pensum = new Pensum(new PensumPK());

        crearItems();
    }

    public boolean isSuccess() {
        return success;
    }

    public void setAccion(boolean accion) {
        this.accion = accion;
    }

    public boolean isAccion() {
        return accion;
    }


    public void setListEstudiante(List<Estudiante> listEstudiante) {
        this.listEstudiante = listEstudiante;
    }

    public List<Estudiante> getListEstudiante() {
        return listEstudiante;
    }

    public String getIdCarrera() {
        return idCarrera;
    }

    public void setIdCarrera(String idCarrera) {
        this.idCarrera = idCarrera;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    public String getMatricula() {
        return matricula;
    }

    public Carrera getCarrera() {
        return carrera;
    }

    public void setCarrera(Carrera carrera) {
        this.carrera = carrera;
    }

    public String getTipoBusqueda() {
        return tipoBusqueda;
    }

    public void setTipoBusqueda(String tipoBusqueda) {
        this.tipoBusqueda = tipoBusqueda;
    }

    public Estudiante getEstudiante() {
        return estudiante;
    }

    public void setEstudiante(Estudiante estudiante) {
        this.estudiante = estudiante;
    }

    public List<SelectItem> getCarrerasItems() {
        return carrerasItems;
    }

    public void setCarrerasItems(List<SelectItem> carrerasItems) {
        this.carrerasItems = carrerasItems;
    }

    public Pensum getPensum() {
        return pensum;
    }

    public void setPensum(Pensum pensum) {
        this.pensum = pensum;
    }



    private void crearItems() {
        Iterator itr = CarreraDAO.getAllCarreras().iterator();

        while (itr.hasNext()) {
            Carrera carrera = (Carrera) itr.next();
            carrerasItems.add(new SelectItem(carrera.getIdCarrera(), carrera.getNombre()));
        }
    }


/* El metodo insertar, envia un objeto del tipo Estudiante a la clase EstudianteDAO
 * para poder  insertar un estudiante a la base de datos
 * 
 * @see  EstudiateDAO
*/
    public void insertar() {
        estudiante.setIdEstado(new Estado('A'));
        pensum.getPensumPK().setIdPensum(2);
        estudiante.setPensum(pensum);

        Usuario user = new Usuario(estudiante.getMatricula().toString(), 3, "123456");

        estudiante.setIdUsuario(user);
        boolean insertar = EstudianteDAO.insertar(estudiante);

        if (insertar) {
            estudiante = new Estudiante();
            estudiante.setSexo('M');
            pensum = new Pensum(new PensumPK());
            estudiante.setPensum(pensum);
        }
        
    }

/* El metodo buscar utiliza la variable "tipoBusqueda" para identificar que tipo de busqueda desea realizar el usuario
 * si el tipoBusqueda = 1 entonces se refiere a una busqueda segun la matricula del estudiante.
 * De lo contrario el tipo de busqueda se refiere a una busqueda de estudiantes segun la carrera especificada.
 * Este metodo envia a la clase EstudianteDAO el parametro correspondiente para cada tipo de busqueda
 * y guarda un objeto del tipo Estudiante el cual luego sera desplegado en la vida correspondiente.
 *
 * @Param  event  ActionEvent
 * @see    EstudianteDAO
 * 
 */


    public void buscar(ActionEvent event) {
        success = false;
        
        if (tipoBusqueda.equals("1")) {
            estudiante = EstudianteDAO.buscarPorMatricula(matricula);
            if (estudiante.getMatricula() == null) {
                accion = false;

            } else {
                accion = true;
            }
        } else {

            listEstudiante = EstudianteDAO.buscarPorCarrera(idCarrera);
        }
    }

    /* El metodo modificar envia un objeto del tipo estudiante a la clase EstudianteDAO
     * para modificar un estudiante en la base de datos
     *
     * @event  ActionEvent
     * @see    EstudianteDAO
     */
    public void modificar(ActionEvent event) {
        success = EstudianteDAO.modificar(estudiante);
    }

    /* El metodo eliminar envia un objeto del tipo estudiante a la clase EstudianteDAO
     * para eliminar un estudiante en la base de datos
     *
     * @event  ActionEvent
     * @see    EstudianteDAO
     */
    public void eliminar(ActionEvent event) {
        success = EstudianteDAO.eliminar(estudiante);
    }

    public void resetearBean(ActionEvent event) {
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ve = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(elContext, "#{estudianteBean}", ManageStudentBean.class);

        ManageStudentBean bean = new ManageStudentBean();
        ve.setValue(elContext, bean);
    }
}